package product

import (
	"gitee.com/tang_q/gin-vue3-admin-api/global"
	"gitee.com/tang_q/gin-vue3-admin-api/model/dto"
	"gorm.io/gorm"
)

type Brand struct {
	gorm.Model
	Name        string   `gorm:"type:varchar(255);comment:品牌名称;unique;not null" json:"name"`
	Logo        string   `gorm:"comment:品牌logo" json:"logo,omitempty"`
	Description string   `gorm:"type:varchar(255);comment:品牌描述" json:"description"`
	RegionId    int      `gorm:"comment:所属区域" json:"region_id"`
	Region      Region   `json:"region"`
	CategoryId  int      `gorm:"comment:所属分类" json:"category_id"`
	Category    Category `json:"category"`
	Status      int      `gorm:"comment:状态" json:"status"`
	Sort        int      `gorm:"comment:排序" json:"sort"`
}

func init() {
	err := global.DB.AutoMigrate(&Brand{})
	if err != nil {
		global.Logger.Error("迁移品牌表失败", err)
		return
	}
}

func GetBrandList(req dto.BrandQueryDTO) (brandList []Brand, count int64, err error) {
	qs := global.DB.Model(&Brand{})

	// 名称过滤
	if req.Name != "" {
		qs = qs.Where("name LIKE ?", "%"+req.Name+"%")
	}

	// 地区过滤
	if req.Region != "" {
		qs = qs.Joins("JOIN regions ON regions.id = brands.region_id").Where("regions.name = ?", req.Region)
	}

	// 分类过滤
	if req.Category != "" {
		qs = qs.Joins("JOIN categories ON categories.id = brands.category_id").Where("categories.name = ?", req.Category)
	}

	// 先计算总记录数，不带分页
	if err := qs.Where("status = ?", req.Status).Count(&count).Error; err != nil {
		return nil, 0, err
	}

	// 再进行分页查询
	err = qs.Preload("Category").Preload("Region").
		Where("status = ?", req.Status).
		Offset((req.Page - 1) * req.PageSize).
		Limit(req.PageSize).
		Order("sort ASC").
		Find(&brandList).Error

	return
}

func AddRegOrCategory(data dto.AddRegOrCategoryDTO) error {
	if data.Type == "region" {
		return global.DB.Create(&Region{Name: data.Name}).Error
	}
	if data.Type == "category" {
		return global.DB.Create(&Category{Name: data.Name}).Error
	}
	return nil
}

// CreateBrand 用于创建一个新的品牌。
// 接受一个 CreateBrandDTO 类型的数据作为参数，该数据包含了创建品牌所需的信息。
// 返回一个错误，如果在处理过程中发生错误，则返回相应的错误。
func CreateBrand(data dto.CreateBrandDTO) error {
	// 初始化 region 和 category 对象，用于后续查询。
	var region Region
	var category Category

	// 根据传入的数据，通过 GetRegionByName 函数查询并设置 region 对象。
	// 如果查询过程中发生错误，则直接返回该错误。
	err := region.GetRegionByName(data.Region)
	if err != nil {
		return err
	}

	// 类似地，查询并设置 category 对象。
	err = category.GetCategoryByName(data.Category)
	if err != nil {
		return err
	}

	// 初始化 brand 对象，用于存储新品牌的信息。
	var brand Brand

	// 获取下一个排序值，用于新品牌的排序。
	// 如果获取过程中发生错误，则直接返回该错误。
	sort, err := GetNextSort()
	if err != nil {
		return err
	}

	// 根据传入的数据，设置 brand 对象的属性。
	brand.Name = data.Name
	brand.Description = data.Description
	brand.Logo = data.Logo
	brand.Status = data.Status
	brand.Region = region
	brand.Category = category
	brand.Sort = sort

	// 使用 global.DB 创建新品牌，并检查是否有错误发生。
	// 如果发生错误，则返回该错误。
	return global.DB.Create(&brand).Error
}

func GetNextSort() (nextSort int, err error) {
	var brand Brand
	if err := global.DB.Model(&Brand{}).Order("sort DESC").First(&brand).Error; err != nil {
		return -1, err
	}
	return brand.Sort + 1, nil
}

func UpdateBrand(data dto.UpdateBrandDTO) error {
	var brand Brand
	if err := global.DB.Where("id = ?", data.ID).First(&brand).Error; err != nil {
		return err
	}
	brand.Name = data.Name
	brand.Description = data.Description
	brand.Logo = data.Logo
	brand.Status = data.Status
	if data.Region != brand.Region.Name {
		var region Region
		err := region.GetRegionByName(data.Region)
		if err != nil {
			return err
		}
		brand.Region = region
	}
	if data.Category != brand.Category.Name {
		var category Category
		err := category.GetCategoryByName(data.Category)
		if err != nil {
			return err
		}
		brand.Category = category
	}
	return global.DB.Save(&brand).Error
}

func DeleteBrand(id string) error {
	return global.DB.Unscoped().Delete(&Brand{}, id).Error
}
func DeleteBrandBatch(ids dto.IdsDTO) error {
	return global.DB.Unscoped().Delete(&Brand{}, ids.Ids).Error
}
